import { HOST } from '../config'
const app = getApp()

export default {
	// get 请求
	get(url, data, header = {}) {
		return request(url, data, 'GET', header)
	},
	// post 请求
	post(url, data, header = {}) {
		return request(url, data, 'POST', header)
	},

	// put 请求
	put(url, data, header = {}) {
		return request(url, data, 'PUT', header)
	},

	// 删除请求
	delete(url, data, header = {}) {
		return request(url, data, 'DELETE', header)
	},

	// 上传请求
	upload(url, filePath, name, formData) {
		return upload(url, filePath, name, formData)
	}
}


/**
 * @desc 文件上传请求封装 
 * @param {string} url 上传接口地址（不包含域名）
 * @param {string} filePath 要上传文件资源的路径 (本地路径)
 * @param {string} name 文件名称值 key
 * @param {object} [formData] HTTP 请求中其他额外的 form data
 * @param {number} [timeout=60000] 超时时间，单位为毫秒
 * @return {promise} 上传结果 promise
 */
function upload(url, filePath, name = 'file', formData = {}, timeout = 60000) {
	// 返回一个 Pormise ，使其支持 Promise 调用
	return new Promise((resolve, reject) => {
		wx.uploadFile({
			url: HOST + url,
			filePath,
			name,
			formData,
			header: {
				// 上传接口必传 token ，后端会校验该值是否合法
				// 注意 Bearer 后有一个空格
				Authorization: `Bearer ${app.token}`
			},
			timeout,
			success: ({ data }) => {
				if (typeof data === 'string') {
					data = JSON.parse(data)
				}
				resolve(data)
			},
			fail: err => {
				// 失败时返回错误信息，这样使用端不需要 try catch 接收
				reject({
					code: err.errno || 400,
					message: err.errMsg,
					data: {}
				})

				// 异常提示
				wx.showToast({
					title: err.errMsg,
					icon: 'error',
					duration: 2000
				})
			}
		})
	})
}

/**
 * @desc 接口请求封装 
 * @param {string} url 接口地址（不包含域名）
 * @param {object} [data] 请求参数
 * @param {string} [method="GET"] 请求方法，目前支持 get、post、put、delete 四种
 * @param {object} [header] 请求头信息，默认为 Authorization
 * @return {promise} 请求结果 promise
 */
function request(url, data = {}, method = 'GET', header = {}) {
	// 校验是否存在 token，不存在则不传入
	if (app.token) {
		header = Object.assign(header, {
			// 注意 Bearer 后有一个空格
			Authorization: `Bearer ${app.token}`
		})
  }
  
	// 返回一个 Pormise ，使其支持 Promise 调用
	return new Promise((resolve, reject) => {
		wx.request({
			url: HOST + url,
			data,
			method,
			header,
			success: ({ statusCode, data }) => {
				// 用户未登录或者 token 过期，则返回登录页
				if (statusCode === 401) {
					setTimeout(() => {
						wx.navigateTo({
							url: "/pages/account/login/index"
						})
					}, 0)
				}

				// 请求成功
				if (statusCode === 200) {
					// 业务状态码大于400，则为异常，并显示对应异常提示信息
					if (data.code >= 400) {
						wx.showToast({
							title: String(data.message || 'system error'),
							icon: 'none',
							duration: 2000
						})
					}
					// 返回该异常值
					resolve(data)
				}

				// 其它异常，返回异常值
				resolve({
					code: statusCode,
					message: data.message,
					data: {}
				})
			},
			fail: err => {
				// 失败时返回错误信息，这样使用端不需要 try catch 接收
				reject({
					code: err.errno || 400,
					message: err.errMsg,
					data: {}
				})

				// 异常提示
				wx.showToast({
					title: err.errMsg,
					icon: 'error',
					duration: 2000
				})
			}
		})
	})
}